package contable.dominio;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Describe el detalle cardex de un inventario de producto o insumo
 *
 * @author suncin
 */
public class Cardex {

    private Date fecha;
    private boolean entrada;
    private int cantidad;
    private double costo;
    private double monto;
    private Periodo periodo;
    private Inventario producto;

    /**
     * Crea un detalle cardex para un inventario
     *
     * @param producto El inventario al que pertenece el detalle cardex
     */
    public Cardex(Inventario producto) {
        this.producto = producto;
    }

    /**
     * Verificar si el detalle cardex trata de una compra o una venta
     *
     * @return true Si es una compra<br>false Si se trata de una venta
     */
    public boolean esIngreso() {
        return entrada;
    }

    /**
     * Define si el detalle cardex se trata de una compra o una venta
     *
     * @param entrada Si se trata de una compra debe ser true si no false
     */
    public void esCompra(boolean entrada) {
        this.entrada = entrada;
    }

    /**
     * Obtener la fecha y hora en que se realizo el detalle cardex
     *
     * @return La hora y la fecha en que se realizo el registro
     */
    public Date getFecha() {
        return fecha;
    }

    /**
     * Definir la fecha y hora en que se realiza el detalle cardex
     *
     * @param fecha La fecha y hora en que se realizo el registro
     */
    public void setFecha(Date fecha) {
        if (fecha == null) {
            throw new IllegalArgumentException("La fecha del cardex no se puede dejar vacia");
        } else {
            this.fecha = fecha;
        }
    }

    /**
     * Obtener la cantidad del detalle cardex
     *
     * @return La cantidad del detalle cardex
     */
    public int getCantidad() {
        return cantidad;
    }

    /**
     * Definir la cantidad del detalle cardex
     *
     * @param cantidad La cantidad del detalle
     */
    public void setCantidad(int cantidad) {
        if (cantidad < 0) {
            throw new IllegalArgumentException("La cantidad no puede ser negativa");
        } else {
            this.cantidad = cantidad;
        }
    }

    /**
     * Obtener el costo del detalle cardex
     *
     * @return El costo unitario del detalle cardex
     */
    public double getCosto() {
        return costo;
    }

    /**
     * Definir el costo del detalle cardex
     *
     * @param costo El costo unitario del detalle cardex
     */
    public void setCosto(double costo) {
        this.costo = (double) Math.round(costo * 100) / 100;
    }

    /**
     * Obtener el monto del detalle cardex
     *
     * @return El monto del detalle cardex
     */
    public double getMonto() {
        return monto;
    }

    /**
     * Establecer el monto del detalle cardex
     */
    public void setMonto() {
        if (esIngreso()) {
            this.monto = (double) Math.round((costo * cantidad) * 100) / 100;
        } else {
            this.monto = (double) Math.round((producto.getCosto() * cantidad) * 100) / 100;
        }
    }

    /**
     * Obtener el periodo en que se realizo el detalle cardex
     *
     * @return El periodo del detalle cardex
     */
    public Periodo getPeriodo() {
        return periodo;
    }

    /**
     * Definir el periodo en que se realiza el detalle cardex
     *
     * @param periodo El periodo del detalle cardex
     */
    public void setPeriodo(Periodo periodo) {
        this.periodo = periodo;
    }

    /**
     * Obtener el inventario del producto o insumo del detalle cardex
     *
     * @return El inventario al que pertenece el detalle cardex
     */
    public Inventario getProducto() {
        return producto;
    }

    /**
     * Definir el inventario de producto o insumo al que pertenece el detalle
     * cardex
     *
     * @param producto El inventario al que pertenece el detalle cardex
     */
    public void setProducto(Inventario producto) {
        this.producto = producto;
    }

    @Override
    public String toString() {
        return "Fecha y hora: " + new SimpleDateFormat("dd MMMM 'de' yyyy 'a las' HH:mm:ss").format(fecha)
                + "\nIngreso: " + entrada
                + "\nCantidad: " + cantidad
                + "\nCosto: $ " + costo
                + "\nMonto: $ " + monto
                + '\n' + producto
                + '\n' + periodo;
    }
}
